24.7.3. Properties Conversion
24.7.3 属性转换
将外部应用配置绑定到@ConfigurationProperties beans时,Spring Boot会尝试将属性强制转换为正确的类型。如果需要自定义类型转换器,你可以提供一个ConversionService bean(名为conversionService的bean),或自定义属性编辑器(通过CustomEditorConfigurer bean),或自定义Converters(bean定义时需要注解@ConfigurationPropertiesBinding)。
注 由于该bean在应用程序生命周期的早期就需要使用,所以确保限制你的ConversionService使用的依赖。通常,在创建时期任何你需要的依赖可能都没完全初始化。如果强制配置关键字不需要它,而且只依赖满足@ConfigurationPropertiesBinding的自定义的转换器,你可能想要重命名自定义的ConversionService。
时间段转换
Spring Boot对表达时间段有专门的支持。 如果你暴露了java.time.Duration属性,可用下列格式的应用属性:
- 常规的 long表示(默认单位为毫秒,除非指定了@DefaultUnit)
- java.util.Duration使用的标准的ISO-8601格式
- 组合了值与单位的更加易读的格式(比如10s表示10秒)
考虑下面的例子:
@ConfigurationProperties("app.system")
public class AppSystemProperties {
    @DurationUnit(ChronoUnit.SECONDS)
    private Duration sessionTimeout = Duration.ofSeconds(30);
    private Duration readTimeout = Duration.ofMillis(1000);
    public Duration getSessionTimeout() {
        return this.sessionTimeout;
    }
    public void setSessionTimeout(Duration sessionTimeout) {
        this.sessionTimeout = sessionTimeout;
    }
    public Duration getReadTimeout() {
        return this.readTimeout;
    }
    public void setReadTimeout(Duration readTimeout) {
        this.readTimeout = readTimeout;
    }
}
为了将会话超时指定为30秒,30, PT30S和 30s都是等价的。将读取超时指定为500毫秒,可以用下列格式里的任何一种:500, PT0.5S与500ms。
你也可以使用任何支持的单位:
- ns用于纳秒
- ms用于毫秒
- s用于秒
- m用于分
- h用于小时
- d应用日
默认单位是毫秒,可以使用@DefaultUnit重写。
注 如果你正在升级之前的版本,之前的版本简单地使用Long来表达时间段,如果切换到Duration时不是毫秒,要确保定义了单位(使用@DefaultUnit)。这样做的话,在支持更加丰富的格式的同时,升级也能更加透明。